package com.giCompiler.business;

import java.io.File;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import com.giCompiler.bean.Pacote;
import com.giCompiler.bean.Projeto;
import com.giCompiler.bean.CodigoFonte;
import com.giCompiler.bean.VinculoUsuarioProjeto;
import com.giCompiler.exception.BusinessException;
import com.giCompiler.dao.CodigoFonteDao;
import com.giCompiler.dao.PacoteDao;
import com.giCompiler.dao.ProjetoDao;
import com.giCompiler.dao.VinculoUsuarioProjetoDao;

public class ManterProjetoBusiness {
	
	//Caminho do Ismael
	//private final static String caminhoDiretorioProjetos = "C:\\Documents and Settings\\usuario\\workspace\\giCompiler\\WebContent\\Projetos\\";
	
	//Caminho do Ismael - Servidor
	private final static String caminhoDiretorioProjetos = "C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\webapps\\giCompiler\\Projetos\\";
	
	//Caminho do Geovane
	//private final static String caminhoDiretorioProjetos = "";
		
	public List<Projeto> listarProjetosBusiness(int idUsuario){
		
		return new ProjetoDao().listar(idUsuario);
		
	}	
	
	//Cria um novo projeto
	public void criarProjetoBusiness(Projeto projeto, int idUsuario) throws BusinessException{
						
		projeto.setDataCriacao(pegarDataAtual());
		projeto.setDataModificacao(pegarDataAtual());
				
		if(procurarNomeProjeto(projeto) == false){
			if(criarDiretorioProjeto(projeto) == true){	
				
				new ProjetoDao().inserir(projeto);						
				new VinculoUsuarioProjetoDao().inserir(montarVup(projeto.getIdProjeto(),idUsuario,5));
				
				Pacote pacote = montarPacoteDefault(projeto.getIdProjeto());
				new PacoteDao().inserir(pacote);
				
				CodigoFonte codigoFonte =  montarCodigoFonteDefault(projeto.getNome(), pacote.getIdPacote(), idUsuario);
				new CodigoFonteDao().inserir(codigoFonte);
				
			}
			else{
				System.out.println("10001 - Error ao tentar criar o diretorio!");
				throw new BusinessException("10001 - Error ao tentar criar o diretorio!");
			}
		}else{
			System.out.println("10002 - Error ao criar o projeto! O nome do projeto ja esta em uso.");
			throw new BusinessException("10002 - Error ao criar o projeto! O nome do projeto ja esta em uso.");
		}
	}
	
	//Altera um projeto ja existente
	public void alterarProjetoBusiness(Projeto projeto){
		
		projeto.setDataModificacao(pegarDataAtual());
		new ProjetoDao().alterar(projeto);
		
	}
	
	//Exclui um projeto
	public void excluirProjetoBusiness(Projeto projeto, int idUsuarioLogado) throws BusinessException{
		
		List<CodigoFonte> cfs = new ArrayList<CodigoFonte>();
		ProjetoDao pdDao = new ProjetoDao();
		CodigoFonteDao cfDao = new CodigoFonteDao();
		PacoteDao pDao = new PacoteDao();
		VinculoUsuarioProjetoDao vupDao = new VinculoUsuarioProjetoDao();
								
		int permissao = pergarPermissaoUsuario(idUsuarioLogado, projeto.getIdProjeto());
		
		if(permissao == 5){
			if(excluirDiretorioProjeto(projeto.getNome()) == true){
								
				vupDao.excluirVupDoProjeto(projeto.getIdProjeto());
				cfs = cfDao.pegarCodigoFontesDoProjeto(projeto.getIdProjeto());
				
				for(CodigoFonte cf: cfs)
					new CodigoFonteDao().excluir(cf);
				
				pDao.excluirPacotesDoProjeto(projeto.getIdProjeto());
				pdDao.excluir(projeto);
				
			}else{
				System.out.println("Error ao excluir o projeto! O diretorio não foi encontrado.");
				throw new BusinessException("Error ao excluir o projeto! O diretorio não foi encontrado.");
			}
		}else{
			
			System.out.println("O usuario não tem permissão para executar está tarefa!");
			throw new BusinessException("O usuario não tem permissão para executar está tarefa!");
			
		}
				
	}
	
	//Pesquisa um projeto na base passando como argumento os dados e o filtro
	public List<Projeto> pesquisarProjetoBusiness(String dados, String filtro){
				
		List<Projeto> projetos;
		ProjetoDao projetoDao = new ProjetoDao();
		
		int tipo = 0;//Inteiro
		
		if(filtro.equals("nome") == true)
			tipo = 1;//String
		else if(filtro.equals("descricao") == true)
			tipo = 1;//String
		else if(filtro.equals("dataCriacao") == true)
			tipo = 2;//Data
		else if(filtro.equals("dataModificacao") == true)
			tipo = 2;//Data
		
		if(dados == null || dados.trim().equals(""))
			projetos = null;
		else
			projetos = projetoDao.pesquisar(dados, filtro, tipo);
		
		return projetos;
		
	}
	
	//Pega a hora atual do servidor
	public Date pegarDataAtual(){
	
		return new Date(System.currentTimeMillis());
		
	}
	
	//Cria diretorio do projeto no disco rigido
	public boolean criarDiretorioProjeto(Projeto projeto){
		
		File file = new File(caminhoDiretorioProjetos+projeto.getNome());
		System.out.println("\n\n"+caminhoDiretorioProjetos+projeto.getNome()+"\n\n");
		return file.mkdir();		
		
	}
	
	//Inicia processo de excluir todos os diretorio do projeto
	public boolean excluirDiretorioProjeto(String nomeProjeto){

		File dirProjeto = new File(caminhoDiretorioProjetos+nomeProjeto);
		return excluirArquivosESubDiretorios(dirProjeto);

	}
	
	//Exclui todos os arquivos e subdiretorios de um determinado diretorio
	public boolean excluirArquivosESubDiretorios(File dirProjeto){
				
		if (dirProjeto.isDirectory()) {
			String[] filho = dirProjeto.list();
		    for (int i=0; i<filho.length; i++) {
		        boolean sucesso = excluirArquivosESubDiretorios(new File(dirProjeto, filho[i]));
		        if (!sucesso) {
		            return false;
		        }
		    }
		}

		//O diretorio esta limpo então e deletado
		return dirProjeto.delete();
		
	}
	
	//Procura no BD o projeto atraves do seu nome
	public boolean procurarNomeProjeto(Projeto projeto){
		
		List <Projeto> projetos = new ArrayList <Projeto>();
		ProjetoDao projetoDao = new ProjetoDao();
				
		projetos = projetoDao.procurarNomeProjeto(projeto.getNome());
		
		if(projetos.isEmpty() == true)
			return false;/*Não existe o nome do projeto cadastrado no banco de dados*/
		else
			return true;/*Existe o nome do projeto cadastrado no banco de dados*/	
				
	}
	
	//Monta o vinculo do usuario com o projeto
	public VinculoUsuarioProjeto montarVup(int idProjeto, int idUsuario, int permissao){
		
		VinculoUsuarioProjeto vup = new VinculoUsuarioProjeto();
		
		vup.setIdVcUsuProj(-1);
		vup.setIdProjeto(idProjeto);
		vup.setIdUsuario(idUsuario);
		vup.setPermissao(permissao);
		
		return vup;
	}
	
	//Monta um pacote default
	public Pacote montarPacoteDefault(int idProjeto){
		
		Pacote pacote = new Pacote();
		pacote.setIdPacote(-1);
		pacote.setIdPacSup(0);
		pacote.setIdProjeto(idProjeto);
		pacote.setNome("default");
		pacote.setDataCriacao(pegarDataAtual());
		return pacote;
		
	}
	
	//Monta um codigo-fonte default 
	public CodigoFonte montarCodigoFonteDefault(String nomeProjeto, int idPacote, int idUsuario){
		
		String codigoFonteDefault = "public class "+nomeProjeto+"Main {"+
									"\n    public  static void main(String [] args){"+
									"\n\n"+
									"\n    }"+
									"\n}";

		CodigoFonte codigoFonte = new CodigoFonte();
		
		codigoFonte.setIdCodigoFonte(-1);
		codigoFonte.setIdPacote(idPacote);
		codigoFonte.setNome(nomeProjeto+"Main");
		codigoFonte.setCodigoFonte(codigoFonteDefault);
		codigoFonte.setIdUsuario(idUsuario);
		codigoFonte.setDataCriacao(pegarDataAtual());
		codigoFonte.setDataModificacao(pegarDataAtual());
		
		return codigoFonte; 
		
	}
	
	//Pega permissao do usuario referente a um determinado projeto
	public int pergarPermissaoUsuario(int idUsuario, int idProjeto){
		
		List<VinculoUsuarioProjeto> vups = new ArrayList<VinculoUsuarioProjeto>();
		
		VinculoUsuarioProjetoDao vupd = new VinculoUsuarioProjetoDao();
		vups = vupd.pegarVup(idUsuario, idProjeto);
		
		if(vups.isEmpty())
			return -1;
		else
			return vups.get(0).getPermissao();
		
	}
	
}
